import { useMemberStore } from "@/stores"

// 请求基地址
const baseURL = 'https://pcapi-xiaotuxian-front-devtest.itheima.net'


uni.addInterceptor('request', {
    invoke(args: UniApp.RequestOptions) {
        // request 触发前拼接 url
        // args.url = baseURL + args.url
        // 不是 http 开头的 基地址 就拼接
        if (args.url.startsWith('http') === false) {
            // 就拼接
            args.url = baseURL + args.url
        }
        args.timeout = 10000
        //TODO : 给请求头添加  Authorization
        args.header={
            'source-client':'miniapp',
            ...args.header
        }
        //获取 token
        const store=useMemberStore()
        const token=store.profile?.token
        if(token){
            args.header.Authorization=token
        }
    }
})

// 请求拦截器
uni.addInterceptor('uploadFile', {
  // 拦截前触发
  invoke(args: UniApp.RequestOptions) {
    // 不是 http 开头的 基地址 就拼接
    if (args.url.startsWith('http') === false) {
      // 就拼接
      args.url = baseURL + args.url
    }
    // 设置超时时间
    args.timeout = 10000
    // TODO: 给请求头添加 Authorization
    args.header = {
      'source-client': 'miniapp',
      ...args.header
    }
    // 获取token
    const store = useMemberStore()
    const token = store.profile?.token
    if (token) {
      args.header.Authorization = token
    }
  }
})

//请求函数的封装

//定义服务器响应回来的数据类型
type ResDataType<T> = {
    code: string
    msg: string
    result: T
}

export function http<T>(options: UniApp.RequestOptions) {
    //返回 Promise 对象
    return new Promise<ResDataType<T>>((resolve, reject) => {
        // 调用 uni.request 方法
        uni.request({
            ...options,
            // 成功
            success: (res) => {
                // console.log(res);
                if (res.statusCode >= 200 && res.statusCode <= 300) {
                    // 调用
                    resolve(res.data as ResDataType<T>)
                } else if (res.statusCode === 404) {
                    // 401错误还是404  -> 清理用户信息，跳转到登录页
                    const memberStore = useMemberStore()
                    memberStore.clearProfile()
                    uni.navigateTo({ url: '/pages/login/login' })
                    reject(res)
                } else {
                    //其他错误
                    uni.showToast({
                        icon: 'none',
                        title: (res.data as ResDataType<T>).msg || '请求错误'
                    })
                    reject(res)
                }

            },
            // 失败
            fail: (err) => {
                // 给用户提示
                uni.showToast({
                    title: '请求发生了错误',
                    icon: 'none'
                })
                reject(err)
            }
        })
    })
}